//package edu.aysf.config;
//
//import org.springframework.cloud.gateway.route.RouteLocator;
//import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
//import org.springframework.context.annotation.Bean;
//
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.time.ZonedDateTime;
//
///*
// * @Author 郑老师
// * @Version: 1.0
// * @Desc
// * @Date 2024-12-06 14:18
// * @Update
// */
//public class GatewayConfig2 {
//    /**
//     * Before路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator beforeRouteLocator(RouteLocatorBuilder builder) {
//        // 当前时间加3天，并且将系统默认时区设置为当前时区
//        ZonedDateTime dateTime = LocalDateTime.now().plusDays(3).atZone(ZoneId.systemDefault());
//
//        return builder.routes()
//                .route("before_route",
//                        predicateSpec -> predicateSpec.before(dateTime)
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * After路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator afterRouteLocator(RouteLocatorBuilder builder) {
//
//        // 当前时间减3天，并且将系统默认时区设置为当前时区
//        ZonedDateTime dateTime = LocalDateTime.now().minusDays(3).atZone(ZoneId.systemDefault());
//
//        return builder.routes()
//                .route("after_route", predicateSpec -> predicateSpec.after(dateTime)
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * Between路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator betweenRouteLocator(RouteLocatorBuilder builder) {
//
//        // 当前时间减3天，并且将系统默认时区设置为当前时区
//        ZonedDateTime dateTimeBegin = LocalDateTime.now().minusDays(3).atZone(ZoneId.systemDefault());
//        // 当前时间加5天，并且将系统默认时区设置为当前时
//        ZonedDateTime dateTimeAfter = LocalDateTime.now().plusDays(5).atZone(ZoneId.systemDefault());
//
//        return builder.routes()
//                .route("between_route", predicateSpec -> predicateSpec.between(dateTimeBegin, dateTimeAfter)
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * Cookie路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator cookieRouteLocator(RouteLocatorBuilder builder) {
//
//        return builder.routes()
//                .route("cookie_route", predicateSpec -> predicateSpec.cookie("city", "siping")
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * Header路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator headerRouteLocator(RouteLocatorBuilder builder) {
//
//        return builder.routes()
//                .route("header_route",
//                        predicateSpec -> predicateSpec.header("X-Request-Id", "\\d+")
//                                .and()
//                                .header("Color", "re.+")
//                                .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * Host路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator hostRouteLocator(RouteLocatorBuilder builder) {
//        return builder.routes()
//                .route("host_route",
//                        predicateSpec -> predicateSpec
//                                .host("**.somehost.org", "**.anotherhost.org")
//                                .uri("https://example.org"))
//                .build();
//    }
//    /**
//     * Method路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator methodRouteLocator(RouteLocatorBuilder builder) {
//
//        return builder.routes()
//                .route("method_route", predicateSpec -> predicateSpec
//                        .method("GET", "POST")
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * Query路由断言工厂 —— API式
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator queryRouteLocator(RouteLocatorBuilder builder) {
//
//        return builder.routes()
//                .route("query_route", predicateSpec -> predicateSpec
//                        .query("color", "gr.+")
//                        .and()
//                        .query("size")
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * RemoteAddr路由断言工厂 —— API式
//     * RemoteAddr路由断言工厂，用于判断提交请求的客户端ip地址是否在断言中指定的ip范围或ip列表中。
//     * 若请求的客户端ip在指定的ip范围或ip列表中，则匹配成功，断言为True
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator remoteAddrRouteLocator(RouteLocatorBuilder builder) {
//        return builder.routes()
//                .route("remoteAddr_route", predicateSpec -> predicateSpec
//                        .remoteAddr("192.168.3.1/24")
//                        .uri("https://example.org"))
//                .build();
//    }
//
//    /**
//     * Weight路由断言工厂 —— API式
//     * Weight路由断言工厂接受两个参数，一个是组group；另一个是权重Weight（一个int）。
//     * 该断言用于实现对同一组中的不同URI实现指定权重的负载均衡，对于同一组中的多个URI地址，
//     * 路由器会根据设置的权重，按比例将请求转发给相应的URI
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator weightRouteLocator(RouteLocatorBuilder builder) {
//
//        return builder.routes()
//                .route("weight_high", predicateSpec -> predicateSpec
//                        .weight("group", 8)
//                        .uri("https://weighthigh.org"))
//                .route("weight_low", predicateSpec -> predicateSpec
//                        .weight("group", 2)
//                        .uri("https://weightlow.org"))
//                .build();
//    }
//
//    /**
//     * XForwardedRemoteAddr路由断言工厂 —— API式
//     * XForwarded Remote Addr路由断言工厂接受一个参数，是一个ip地址，
//     * 例如192.168.0.1/16（其中192.168.0.1是IP地址，16是子网掩码）。
//     * 只要当前请求头中追加入X-Forwarded-For的ip出现在路由指定的ip列表中，则匹配成功，断言为 true。
//     * @param builder
//     * @return
//     */
//    @Bean
//    public RouteLocator xForwardedRemoteAddrRouteLocator(RouteLocatorBuilder builder) {
//
//        return builder.routes()
//                .route("xForwardedRemoteAddr_route", predicateSpec -> predicateSpec
//                        .xForwardedRemoteAddr("192.168.1.1/24", "192.168.60.10")
//                        .uri("https://example.org"))
//                .build();
//    }
//
//}
